package com.cy.sc.aop;

import lombok.extern.java.Log;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * <br>@class: ControllerAop
 * <br>@description: boot中aop实现
 * <br>@author: cy
 * <br>@date: 2020-04-02 11:28:30
 * <br>@version: 1.0
 * <br>
 * <br>@since: (版本) 作者 时间 注释
 */

@Aspect //切点，阿斯拜克特
@Component //声明spring组件
@Log
public class ControllerAop {
    /**
     * 定义切入点，切入点为com.example.demo.aop.AopController中的所有函数
     * 通过@Pointcut注解声明频繁使用的切点表达式
     */
    @Pointcut("execution(public * com.cy.sc.controller.DeptController.*(..)))")
    public void BrokerAspect() {
    }

    /**
     * @description 在连接点执行之前执行的通知
     */
    @Before("BrokerAspect()")
    public void doBeforeGame() {
        viewDebugInfo();
        log.info("前事务！");
    }

    /**
     * @description 在连接点执行之后执行的通知（返回通知和异常通知的异常）
     */
    @After("BrokerAspect()")
    public void doAfterGame() {
        log.info("后事物！");
    }

    /**
     * @description 在连接点执行之后执行的通知（返回通知）
     */
    @AfterReturning("BrokerAspect()")
    public void doAfterReturningGame() {
        log.info("返回通知！");
    }

    /**
     * @description 在连接点执行之后执行的通知（异常通知）
     */
    @AfterThrowing("BrokerAspect()")
    public void doAfterThrowingGame() {
        log.info("异常通知！");
    }

    private void viewDebugInfo(){
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();
        log.info("方法执行中==>"+request.getLocalPort()+"==>"+request.getRemotePort());
    }
}
